package tp1;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.net.ConnectException;
import java.net.UnknownHostException;
import tp1.AfficheurFormes;
import tp1.TrieurListeForme.SorteTri;

import javax.swing.*;

@SuppressWarnings("serial")
public class Main extends JFrame implements WindowListener, ActionListener {
	private final static String NOM_FENETRE = "Client formes";
	private final Dimension DIMENSION_FENETRE = new Dimension(500, 500);
	private AfficheurFormes af = new AfficheurFormes(this);
	private JMenuBar menuBar = new JMenuBar();
	private JMenu menuAction = new JMenu("Fichier");
	/*private JMenuItem miDesactiver = new JMenuItem("D�activer");
	private JMenuItem miActiver = new JMenuItem("Activer");*/
	private JMenuItem miObtenirFormes = new JMenuItem("Obtenir formes");
	/*private JMenu menuConnection = new JMenu("Serveur");
	private JMenuItem miConnecter = new JMenuItem("Connecter");
	private JMenuItem miDeconnecter = new JMenuItem("D�connecter");*/
	private JMenu menuOrdre = new JMenu("Ordre");
	private JRadioButtonMenuItem rdmTrieNSeqCroissant = new JRadioButtonMenuItem("Num�ro de s�quence croissant");
	private JRadioButtonMenuItem rdmTrieNSeqDecroissant = new JRadioButtonMenuItem("Num�ro de s�quence decroissant");

	private JRadioButtonMenuItem rdmTrieAireCroissant = new JRadioButtonMenuItem("Aire croissante");
	private JRadioButtonMenuItem rdmTrieAireDecroissant = new JRadioButtonMenuItem("Aire decroissante");

	private JRadioButtonMenuItem rdmTrieDistMaxCroissant = new JRadioButtonMenuItem("Distance maximale croissante");
	private JRadioButtonMenuItem rdmTrieDistMaxDecroissant = new JRadioButtonMenuItem("Distance maximale decroissante");

	private JRadioButtonMenuItem rdmTrieTypeFormeCroissant = new JRadioButtonMenuItem("Type de forme croissant");
	private JRadioButtonMenuItem rdmTrieTypeFormeDecroissant = new JRadioButtonMenuItem("Type de forme decroissant");

	private String[] infosConnection;

	public static void main(String[] args) {
		Main frame = new Main();
		frame.setVisible(true);
	}

	public Main() {
		super(NOM_FENETRE);
		creerMenu();
		addWindowListener(this);
		add(af);
		setSize(DIMENSION_FENETRE);
		setResizable(false);
	}

	private void creerMenu() {
		JPopupMenu.setDefaultLightWeightPopupEnabled(false); // Pour que les
																// menu
																// s'affiche par
																// dessus le
																// canvas
		//miDesactiver.setEnabled(false);
		//miDesactiver.addActionListener(this);
		//miActiver.addActionListener(this);
		miObtenirFormes.addActionListener(this);
		//miConnecter.addActionListener(this);
		//miDeconnecter.addActionListener(this);
		rdmTrieNSeqCroissant.addActionListener(this);
		rdmTrieNSeqDecroissant.addActionListener(this);
		rdmTrieAireCroissant.addActionListener(this);
		rdmTrieAireDecroissant.addActionListener(this);
		rdmTrieDistMaxCroissant.addActionListener(this);
		rdmTrieDistMaxDecroissant.addActionListener(this);
		rdmTrieTypeFormeCroissant.addActionListener(this);
		rdmTrieTypeFormeDecroissant.addActionListener(this);
		/*menuAction.add(miDesactiver);
		menuAction.add(miActiver);*/
		menuAction.add(miObtenirFormes);
		//menuConnection.add(miConnecter);
		//menuConnection.add(miDeconnecter);

		// On cree un groupe pour qu'un seul radio button puisse etre
		// selectionne
		ButtonGroup groupe = new ButtonGroup();
		groupe.add(rdmTrieNSeqCroissant);
		groupe.add(rdmTrieNSeqDecroissant);
		groupe.add(rdmTrieAireCroissant);
		groupe.add(rdmTrieAireDecroissant);
		groupe.add(rdmTrieDistMaxCroissant);
		groupe.add(rdmTrieDistMaxDecroissant);
		groupe.add(rdmTrieTypeFormeCroissant);
		groupe.add(rdmTrieTypeFormeDecroissant);

		menuOrdre.add(rdmTrieNSeqCroissant);
		menuOrdre.add(rdmTrieNSeqDecroissant);
		menuOrdre.add(rdmTrieAireCroissant);
		menuOrdre.add(rdmTrieAireDecroissant);
		menuOrdre.add(rdmTrieDistMaxCroissant);
		menuOrdre.add(rdmTrieDistMaxDecroissant);
		menuOrdre.add(rdmTrieTypeFormeCroissant);
		menuOrdre.add(rdmTrieTypeFormeDecroissant);

		menuBar.add(menuAction);
		//menuBar.add(menuConnection);
		menuBar.add(menuOrdre);
		this.setJMenuBar(menuBar);
		//majEtatMenu();
	}

	@Override
	public void windowClosing(WindowEvent e) {
		// Ferme la connection avant de quitter
		af.arreter();
		System.exit(0);
	}

	@Override
	public void windowDeactivated(WindowEvent e) {
	}

	@Override
	public void windowDeiconified(WindowEvent e) {
	}

	@Override
	public void windowIconified(WindowEvent e) {
	}

	@Override
	public void windowOpened(WindowEvent e) {
	}

	@Override
	public void windowActivated(WindowEvent e) {
	}

	@Override
	public void windowClosed(WindowEvent e) {
	}

	@Override
	public void actionPerformed(ActionEvent action) {
		try {
			/*if (action.getSource() == miDesactiver) {
				af.pause();
			} else if (action.getSource() == miActiver) {
				af.demarrer(infosConnection[0], infosConnection[1], false);
			} else if (action.getSource() == miConnecter) {
				infosConnection = JOptionPane.showInputDialog("Quel est le nom d'hote et le port du serveur de formes?", "localhost:10000").split(":");
				af.demarrer(infosConnection[0], infosConnection[1], false);
			} else if (action.getSource() == miDeconnecter) {
				infosConnection = null;
				af.arreter();
			} else */
                    
                        if (action.getSource() == miObtenirFormes) {
				af.arreter();
				infosConnection = JOptionPane.showInputDialog("Quel est le nom d'hote et le port du serveur de formes?", "localhost:10000").split(":");
				af.demarrer(infosConnection[0], infosConnection[1], true);
			}

			else if (action.getSource() == rdmTrieNSeqCroissant)
				af.trier(SorteTri.NSEQCroissant);
			else if (action.getSource() == rdmTrieNSeqDecroissant)
				af.trier(SorteTri.NSEQDecroissant);

			else if (action.getSource() == rdmTrieAireCroissant)
				af.trier(SorteTri.AireCroissant);
			else if (action.getSource() == rdmTrieAireDecroissant)
				af.trier(SorteTri.AireDecroissant);

			else if (action.getSource() == rdmTrieDistMaxCroissant)
				af.trier(SorteTri.DistanceMaxCroissant);
			else if (action.getSource() == rdmTrieDistMaxDecroissant)
				af.trier(SorteTri.DistanceMaxDecroissant);

			else if (action.getSource() == rdmTrieTypeFormeCroissant)
				af.trier(SorteTri.TypeFormeCroissant);
			else if (action.getSource() == rdmTrieTypeFormeDecroissant)
				af.trier(SorteTri.TypeFormeDecroisstant);

		} catch (ConnectException e) {
			JOptionPane.showMessageDialog(this, "Le serveur " + infosConnection[0] + " ne r�pond pas sur le port " + infosConnection[1], "Oups...", JOptionPane.ERROR_MESSAGE);
			infosConnection = null;
			e.printStackTrace();
		} catch (UnknownHostException e) {
			JOptionPane.showMessageDialog(this, "Le nom du serveur est invalide", "Oups...", JOptionPane.ERROR_MESSAGE);
			infosConnection = null;
			e.printStackTrace();
		} catch (Exception e) {
			JOptionPane.showMessageDialog(this, "Une erreur est survenue.", "Oups...", JOptionPane.ERROR_MESSAGE);
			infosConnection = null;
			e.printStackTrace();
		} finally {
			//majEtatMenu();
		}
	}

	/**
	 * Active ou d�sactive les items de menu
	 */
	/*public void majEtatMenu() {
		miDesactiver.setEnabled(af.estActive() && af.estConnecte());
		miActiver.setEnabled(!af.estActive() && af.estConnecte());
		miConnecter.setEnabled(!af.estConnecte());
		miDeconnecter.setEnabled(af.estConnecte());
	}*/
}
